import { _decorator, Component, error, instantiate, Label, Node, Pool, Prefab, ProgressBar, Slider } from 'cc';
import { UIContianer } from './UIContianer';
import { UICompType } from '../NeedToChange/UIConifig';
const { ccclass, property } = _decorator;

let refreshLabel = (oldValue:any,newValue:any,comp:Component)=>{
    (comp as Label).string = newValue;
}

let refreshProgress = (oldValue:any,newValue:any,comp:Component)=>{
    // if(comp.node.name =='_TestBar'){
    //     console.log('菜单的进度条更新');
    // }
    // if(comp.node.parent.name =='Menu'){
    //     console.log('通过父亲名字判断');
    // }
    (comp as ProgressBar).progress = newValue;
}

let refreshSlider = (oldValue:any,newValue:any,comp:Component)=>{
    (comp as Slider).progress = newValue;
}



const CompCallback = {
    Label:refreshLabel,
    ProgressBar:refreshProgress,
    Slider:refreshSlider
}



export class UIUtils{
    //搜索要关注的节点和组件。
    //当前要找的UI的根节点(比如登录界面的根节点，菜单的界面的根节点。)
    //找到之后要存储， uiContainder
    static findNode(node:Node,uiContainder:UIContianer){
        //判断，节点不存在不找,容器没有不找
        if(!node||!uiContainder){
            return;
        }

        //直接当前节点去判断，判断这个节点是否是要关注的节点， 通过节点名字。
        let nodeName = node.name;
        //判断这个名字是否是以'_'开头。 
        if(nodeName.startsWith('_')){
            //如果是，那么这个节点是要关注的节点。
            //存储节点
            uiContainder.addNode(nodeName,node);
            //找这个节点下可能的组件。
            //遍历所有组件。
            for(let compTypeName in UICompType){
                //获取组件
                let compType = UICompType[compTypeName];
                //再到这个节点去获取这个组件compType（Label，Sprite...)
                let comp = node.getComponent(compType);
                //如果组件获取不到，意味着没有这个组件。
                if(!comp){
                    //下一次循环，找下一个组件
                    continue;
                }
                //如果找到，那么存储。
                uiContainder.addComp(nodeName,compTypeName,comp);
            }
        }

        //搜索他的所有子节点，判断子节点是否是要关注的节点。
        let children  =node.children;
        for(let child of children){
            UIUtils.findNode(child,uiContainder);
        }
    }

    static refreshComp(oldValue:any,newValue:any,comp:Component){
        if(!comp){
            error('刷新组件失败，组件不存在');
            return;
        }
        for(let compTypeName in UICompType){
            if(comp instanceof UICompType[compTypeName]){
                CompCallback[compTypeName](oldValue,newValue,comp);
                return;
            }
        }

    }

    //工具类深拷贝方式
    static deepClone = (obj:Object)=>{
        let ret:any = Array.isArray(obj)?[]:{};
        for(let key in obj){
            if(obj[key] instanceof Object){
                ret[key] = UIUtils.deepClone(obj[key]);
                continue;
            }
            ret[key] = obj[key];            
        }
        return ret;
    }

    //工具类对象池创建的方法
    static initNodePool(prefab:Prefab,maxNum?:number):Pool<Node>{
        maxNum=maxNum||5;
        let nodePool=new Pool<Node>(()=>{
            let node=instantiate(prefab);
            return node;
        },maxNum,(node:Node)=>{
            node.destroy();
        })  

        return nodePool;
    }


}

